/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SessionBeans;

import entity.InstanciaTourServicio;
import entity.Tour;
import entity.TourServicio;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

/**
 *
 * @author javier
 */
@Stateless
public class InstanciaTourServicioFacade extends AbstractFacade<InstanciaTourServicio> {
    @PersistenceContext(unitName = "Agencia_de_Turismo_ASPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public InstanciaTourServicioFacade() {
        super(InstanciaTourServicio.class);
    }
    
    public List<InstanciaTourServicio> obtenerInstanciasXServicio(TourServicio tourServicio, Date fechaInicio, Date fechaFin ) {
         TypedQuery<InstanciaTourServicio> q = em.createQuery("SELECT iTS "
                                                            + "FROM InstanciaTourServicio iTS "
                                                            + "WHERE (iTS.llegada BETWEEN :llegada AND :fechaFin )"
                                                            + "AND iTS.tourServicio = :tourServicio", InstanciaTourServicio.class);
        q.setParameter("fechaInicio", fechaInicio);
        q.setParameter("fechaFin", fechaFin);
        q.setParameter("hotelServicio", tourServicio);
        return q.getResultList();       
    }
     
    public List<Tour> obtenerDisponibilidadTour (TourServicio tourServicio, Date fechaInicio, Date fechaFin){
        List<Tour> resultados = tourServicio.getListaToures();
        for (Iterator<Tour>  itTour = resultados.iterator();itTour.hasNext();){
            Tour tour = itTour.next();
            //lunes 
            for (Iterator<Date> itDia = tour.getHorario().getLunes().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getLunes().remove(horario);
                }
            }
            //Martes
            for (Iterator<Date> itDia = tour.getHorario().getMartes().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getMartes().remove(horario);
                }
            }
            //Miercoles
            for (Iterator<Date> itDia = tour.getHorario().getMiercoles().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getMiercoles().remove(horario);
                }
            }
            //Jueves
            for (Iterator<Date> itDia = tour.getHorario().getJueves().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getJueves().remove(horario);
                }
            }
            //viernes
            for (Iterator<Date> itDia = tour.getHorario().getViernes().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getViernes().remove(horario);
                }
            }
            //Sabado
            for (Iterator<Date> itDia = tour.getHorario().getSabado().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getSabado().remove(horario);
                }
            }
            //Domingo
            for (Iterator<Date> itDia = tour.getHorario().getDomingo().iterator();itDia.hasNext(); ){
                Date horario = itDia.next();
                int cantidad = 0 ;
                for (Iterator<InstanciaTourServicio> itIns = this.obtenerInstanciasXServicio(tourServicio, fechaInicio, fechaFin).iterator(); itIns.hasNext();){
                    InstanciaTourServicio instanciaTourServicio = itIns.next();
                    if (instanciaTourServicio.getHorario().equals(horario)){
                        cantidad = cantidad + 1;
                    }                                                   
                }
                if(tour.getCupo()==cantidad){
                    tour.getHorario().getDomingo().remove(horario);
                }
            }
        
        }
        return resultados;
    }
        
        
        
        
      
    
}
